Add ostree_repo_is_writable()
authorMatthew Barnes <mbarnes@redhat.com>
Mon, 19 Jan 2015 01:27:53 +0000 (20:27 -0500)
committerColin Walters <walters@verbum.org>
Wed, 25 Mar 2015 21:24:05 +0000 (17:24 -0400)
doc/ostree-sections.txt
src/libostree/ostree-repo-private.h
src/libostree/ostree-repo.c
src/libostree/ostree-repo.h

index 37888c28416e8bce4afb5a73ea54d35be4823cf9..3452ce957555a8dde14f319f747587657f2cafd9 100644 (file)
@@ -217,6 +217,7 @@ ostree_repo_new_default
 ostree_repo_open
 ostree_repo_set_disable_fsync
 ostree_repo_is_system
+ostree_repo_is_writable
 ostree_repo_create
 ostree_repo_get_path
 ostree_repo_get_mode
index 6e299e240f94b3f08592816dba6cc6af47eb3211..8b07254cedafe57e9b85428c9af17c88054b6302 100644 (file)
@@ -65,6 +65,7 @@ struct OstreeRepo {
 
   gboolean inited;
   gboolean writable;
+  GError *writable_error;
   gboolean in_transaction;
   gboolean disable_fsync;
   GHashTable *loose_object_devino_hash;
index aca70034828492ec9c96def9791ee0aca4ed2d4e..072ae765519724eeaf6e9e97d7bd5c4549e0f5c8 100644 (file)
@@ -381,6 +381,7 @@ ostree_repo_finalize (GObject *object)
   g_clear_pointer (&self->txn_refs, g_hash_table_destroy);
   g_clear_pointer (&self->cached_meta_indexes, (GDestroyNotify) g_ptr_array_unref);
   g_clear_pointer (&self->cached_content_indexes, (GDestroyNotify) g_ptr_array_unref);
+  g_clear_error (&self->writable_error);
   g_clear_pointer (&self->object_sizes, (GDestroyNotify) g_hash_table_unref);
   g_mutex_clear (&self->cache_lock);
   g_mutex_clear (&self->txn_stats_lock);
@@ -551,6 +552,28 @@ ostree_repo_is_system (OstreeRepo   *repo)
   return g_file_equal (repo->repodir, default_repo_path);
 }
 
+/**
+ * ostree_repo_is_writable:
+ * @self: Repo
+ * @error: a #GError
+ *
+ * Returns whether the repository is writable by the current user.
+ * If the repository is not writable, the @error indicates why.
+ *
+ * Returns: %TRUE if this repository is writable
+ */
+gboolean
+ostree_repo_is_writable (OstreeRepo *self,
+                         GError **error)
+{
+  g_return_val_if_fail (self->inited, FALSE);
+
+  if (error != NULL && self->writable_error != NULL)
+    *error = g_error_copy (self->writable_error);
+
+  return self->writable;
+}
+
 /**
  * ostree_repo_get_config:
  * @self:
@@ -1339,6 +1362,11 @@ ostree_repo_open (OstreeRepo    *self,
     }
 
   self->writable = faccessat (self->objects_dir_fd, ".", W_OK, 0) == 0;
+  if (!self->writable)
+    {
+      /* This is returned through ostree_repo_is_writable(). */
+      gs_set_error_from_errno (&self->writable_error, errno);
+    }
 
   if (fstat (self->objects_dir_fd, &stbuf) != 0)
     {
index 96c3536ef6ce8b05f983fafdbd1b3ebd8d62edfd..e775b54da566d3e06639dea14047d9dee2125c30 100644 (file)
@@ -55,6 +55,9 @@ void          ostree_repo_set_disable_fsync (OstreeRepo    *self,
 
 gboolean      ostree_repo_is_system (OstreeRepo   *repo);
 
+gboolean      ostree_repo_is_writable (OstreeRepo  *self,
+                                       GError     **error);
+
 gboolean      ostree_repo_create (OstreeRepo     *self,
                                   OstreeRepoMode  mode,
                                   GCancellable   *cancellable,